<template>
  <div class="loginpage">
    <div class="content">
        <h2>商城App前台登录页面</h2>
        <!-- 引用element的组件 -->
        <el-form :model="loginObj" :rules="loginRules" ref="ruleFormRef">
            <el-form-item label="UserName:" class="item_label" prop="uname">
                <el-input placeholder="请输入邮箱/手机号码登录" class="item_input" v-model.lazy.trim="loginObj.uname"/>
            </el-form-item>
            <el-form-item label="PassWord:" class="item_label" prop="upwd">
                <el-input placeholder="请输入登录密码" show-password class="item_input" v-model.lazy.trim="loginObj.upwd"/>
            </el-form-item>
            <el-form-item prop="isAgree">
                <el-checkbox v-model="loginObj.isAgree" >已阅读并同意《服务条款》</el-checkbox>
                <button @click="change()"  class="change">切换会员登录</button>
            </el-form-item>
            <el-form-item>
                <!-- el-button上的color属性是指修改的按钮的背景颜色 -->
                <el-button type="primary" color="darkcyan" class="txtcol" @click="onLogin(ruleFormRef)">登录</el-button>
            </el-form-item>
        </el-form>
    </div>
  </div>
</template>

<script setup>
import { ElMessage } from "element-plus";
import { inject, reactive, ref } from "vue";
import {md5} from 'js-md5';
import { useRouter } from "vue-router";


// 订阅$axios
const $axios =inject('$axios');
// 路由实例对象
const router= useRouter();
// 组件创建完成后，自动获取表单DOM对象
const ruleFormRef=ref('')
let loginObj=reactive({
    uname:'',
    upwd:'',
    isAgree:'',
})

// 自定义验证复选框
const RuleAgreen=(rule,value,callback)=>{
    // 如果没有勾选复选框
    if(!value){
        callback(new Error('必须勾选该项！'))
    }else{
        callback();
    }
}

// 验证规则对象
const loginRules=reactive({
uname:[
    // 针对第一个账号输入框进行失去焦点时，非空验证
    {required:true,message:'必须填写登录账号',trigger:'blur'}
],
upwd:[
    {required:true,message:'必须填写密码',trigger:'blur'}
],
isAgree:[
    {validator:RuleAgreen,trigger:'change'}
]
})
// 提交表单
const onLogin=(forEl)=>{
    // 提取rules的验证规则结果
    // 此写法适用于非setup结构/vue2写法 this.$ref[forEl].validate((val)=>{
    forEl.validate((val)=>{
        // val为true，表示所有的rules验证都通过
        if(val){
            // 整合需要提交给后端的数据
            let data={
                username:loginObj.uname,
                password:md5(loginObj.upwd)
            }
            // 向登录接口发起请求
            $axios.post('/login',data).then((res)=>{
                if(res.code==='200'){
                    router.push('/admin/index');
                    localStorage.setItem('user',JSON.stringify(res.data))
                }else{
                    ElMessage.error(res.msg);
                }
                
            }).catch((error)=>{
                if(error.response==undefined||error.response.data==undefined){
                    ElMessage.error(error);
                }else{
                    ElMessage.error(error)
                }
                
            })
        }else{
         ElMessage.error('登录失败，请重新登录！')
            return false
            
        }
    })
}

// 切换会员登录
const change=()=>{
    router.push('/admin/')
}
</script>

<style scoped>
.loginpage{
    width: 100%;
    height: 100vh;
    overflow: hidden;
    background-color: #2a2a33;
    position: relative;
}
.loginpage .content{
    width: 400px;
    background-color: rgba(255, 255, 255, 0.8);
    box-shadow: 0px 0px 8px white;
    border-radius: 10px;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
}
.loginpage .content h2{
    color: #008b8b;
    line-height: 80px;
    text-align: center;
    font-size: 24px;
    font-family: "黑体";
}
/* 当使用第三方UI框架时需要修改样式的情况，观察浏览器的最终组件效果： */
/* 情况1：结构比较简单，组件直接生成对应的标签，如el-form直接生成form标签的情况，可以直接针对标签进行样式修改 */
.loginpage .content form{
    width: 90%;
    margin: 0 auto;
}
/* 情况1：结构比较复杂，组件生成多层结构，如el-form-item生成div+div+lable结构的情况，采用自定义选择器设置到组件上的操作 */
.loginpage .content .txtcol{
    width: 100%;
}
/* :deep():穿刺（存在兼容性问题，移动端不显示） */
.loginpage .content :deep(button>span){
    color: white;
}
.loginpage .content .item_label{
    font-weight: 600;
}
.loginpage .content .item_input{
    border: 1px solid gray;
    border-radius: 7px;
    line-height: 40px;
    overflow: hidden;
}
.change{
    height: 30px;
    color: gray;
    background-color: unset;
    border: gray solid 1px;
    border-radius: 6px;
    margin-left: 50px;
}
</style>